﻿
#include <atlbase.h>
#include "zyWidget.h"

BlackMoonUI::zyWidget::zyWidget()
{
	SetMember(L"StartPosition", 开始位置_居中父窗口);
	setType(zyType_Form);
}
int BlackMoonUI::zyWidget::载入(HWND 参数_父窗口, const std::wstring& 参数_标题, POINT 参数_位置, POINT 参数_尺寸, DWORD 参数_窗口风格,
	DWORD 参数_扩展风格,BOOL 参数_不在任务栏显示, const std::wstring& 参数_类名) {
	HWND hwndParent = nullptr;
	int retAtl = 0;
	HWND hwnd = 参数_父窗口;
	HINSTANCE hInstance = zyEnv::getInstance().getHandle();
	if (!hInstance) {
		return FALSE; 
	}

	MyRegisterClass(hInstance, 参数_类名, 0, 0);

	if (参数_窗口风格 == 0) {
		参数_窗口风格 = WS_CAPTION | WS_SYSMENU | WS_VISIBLE;
	}

	if (hwnd == nullptr && 参数_不在任务栏显示) {
		hwndParent = CreateWindowEx(0, 参数_类名.c_str(), L"ShowTaskbar", WS_POPUP, 0, 0, 250, 110, nullptr, nullptr,
			hInstance, nullptr);
		if (!hwndParent) {
			return FALSE; 
		}
	} else {
		hwndParent = hwnd;
	}
	// 默认-1,-1才居中，有坐标了就无需计算，位置要挪到任务栏显示的窗口创建之前
	if (参数_位置.x == -1 && 参数_位置.y == -1) {
		_开始位置到坐标(hwndParent, (INT)GetMember(L"StartPosition"), 参数_尺寸, 参数_位置, FALSE);
		参数_位置.x = MulDiv(参数_位置.x, 96, zyEnv::getInstance().getDpiForWindow());
		参数_位置.y = MulDiv(参数_位置.y, 96, zyEnv::getInstance().getDpiForWindow());
	}
	_SetWindowBorder((int)(INT_PTR)GetMember(L"Border"), 参数_窗口风格, 参数_扩展风格);
	HWND OldFocus = GetFocus();

	if (!_CreateWindow(hwndParent, 参数_标题, 参数_位置, 参数_尺寸, 0, 参数_窗口风格 | WS_CLIPCHILDREN, 参数_扩展风格, 参数_类名)) {
		if (hwndParent && hwndParent != hwnd) {
			DestroyWindow(hwndParent); 
		}
		return FALSE;
	}

	hwnd = 取窗口句柄();
	if (hwndParent && IsWindow(hwndParent) && IsWindowVisible(hwndParent)) {
		EnableWindow(hwndParent, FALSE);
	}

	int bRet = 0;
	MSG 局部_msg = { 0 };
	while (bRet != -1) {
		bRet = GetMessage(&局部_msg, nullptr, 0, 0);
		zyRes* pAccelTable = (zyRes*)GetMember(L"pAccelTable");
		if (pAccelTable) {
			if (TranslateAccelerator(hwnd, (HACCEL)pAccelTable->GetMember(), &局部_msg)) {
				continue;
			}
		}

		if (局部_msg.message >= WM_KEYFIRST && 局部_msg.message <= WM_KEYLAST || 局部_msg.message >= WM_MOUSEFIRST && 局部_msg.message <= WM_MOUSELAST) {
			HWND hWndCtl = 局部_msg.hwnd;
			do {
				zyObject* tempThis = zyEnv::getInstance().getWndObject(hWndCtl);
				if (tempThis && tempThis->getPtrData(L"zyOCX")) {
					retAtl = (int)(INT_PTR)SendMessage(hWndCtl, WM_FORWARDMSG, 0, (LPARAM)&局部_msg);
					break;
				}
				hWndCtl = GetParent(hWndCtl);
			} while (hWndCtl);
		}

		if (retAtl == 0 && 局部_msg.message >= WM_KEYFIRST && 局部_msg.message <= WM_KEYLAST) {
			if (preTranslateMessage(hwnd, zyEnv::getInstance().getWndObject(局部_msg.hwnd), 局部_msg) == FALSE) {
				continue;
			}
		}

		if (retAtl != 0) {
			continue;
		}

		TranslateMessage(&局部_msg);
		DispatchMessage(&局部_msg);

		if (!IsWindow(hwnd)) {
			break;
		}
	}

	if (OldFocus && IsWindow(OldFocus)) {
		SetFocus(OldFocus);
	}
	return (int)(INT_PTR)GetMember(L"DialogResult");
}
BOOL BlackMoonUI::zyWidget::创建(HWND 参数_父窗口, const std::wstring& 参数_标题, POINT 参数_位置, POINT 参数_尺寸, DWORD 参数_窗口风格,
	DWORD 参数_扩展风格,BOOL 参数_不在任务栏显示, const std::wstring& 参数_类名)
{
	HINSTANCE hInstance = zyEnv::getInstance().getHandle();
	MyRegisterClass(hInstance, 参数_类名, 0, 0);
	if(参数_窗口风格 == 0)
	{
		参数_窗口风格 = WS_CAPTION | WS_SYSMENU | WS_VISIBLE | WS_DLGFRAME | WS_BORDER;
	}
	HWND hwnd = 参数_父窗口;
	if(hwnd == 0 && 参数_不在任务栏显示)
	{
		hwnd = CreateWindowEx(0, 参数_类名.c_str(), L"zyShowTaskbar", WS_POPUP, 0, 0, 250, 110, nullptr, nullptr, hInstance, nullptr);
	}
	// 默认-1,-1才居中，有坐标了就无需计算，位置要挪到任务栏显示的窗口创建之前
	if (参数_位置.x == -1 && 参数_位置.y == -1) {
		_开始位置到坐标(hwnd, (INT)GetMember(L"StartPosition"), 参数_尺寸, 参数_位置, 0);
		参数_位置.x = MulDiv(参数_位置.x, 96, zyEnv::getInstance().getDpiForWindow());
		参数_位置.y = MulDiv(参数_位置.y, 96, zyEnv::getInstance().getDpiForWindow());
	}
	_SetWindowBorder((int)(INT_PTR)GetMember(L"Border"), 参数_窗口风格, 参数_扩展风格);
	return _CreateWindow(hwnd, 参数_标题, 参数_位置, 参数_尺寸, 0, 参数_窗口风格|WS_CLIPCHILDREN|WS_CLIPSIBLINGS, 参数_扩展风格, 参数_类名);
}
BOOL BlackMoonUI::zyWidget::取资源控件(const std::wstring& 参数_资源名 /*XML的 名称 属性,如： <按钮 名称="xxx">*/, zyWindow& 参数_控件 /*返回控件*/) {
    // 获取 Controls 成员
  //  auto controlsPtr = GetMember(L"Controls");
  //  if (!controlsPtr) {
  //      return false;
  //  }
  //  // 确保 Controls 是 std::unordered_map<std::wstring, LPVOID> 类型
  //  auto* controls = (std::unordered_map<std::wstring, LPVOID>*)(controlsPtr);
  //  if (!controls) {
  //      return false;
  //  }
  //  // 检查参数是否为空或包含非法字符
  //  if (参数_资源名.empty()) {
  //      return false;
  //  }
  //  // 查找资源控件
  //  auto it = controls->find(参数_资源名);
  //  if (it != controls->end()) {
		//return 参数_控件.setObject(static_cast<zyObject*>(it->second));
  //  }

	zyObject* pControl = 子程序_取资源控件(getHwnd(), 参数_资源名);
    if (pControl) {
		return 参数_控件.setObject(pControl);
	}
	return false;
}
BlackMoonUI::zyObject* BlackMoonUI::zyWidget::取资源控件(const std::wstring& 参数_资源名) {
	zyObject* pControl = 子程序_取资源控件(getHwnd(), 参数_资源名);
	return pControl;
}
//int  BlackMoonUI::zyWidget::枚举资源控件(std::vector<zyObject*> &obj) {
//	auto* Controls = (std::unordered_map<std::wstring, LPVOID>*)GetMember(L"Controls");
//	if (Controls) {
//		obj.clear();
//		for (const auto& pair : *Controls) {
//			zyObject* pControl = (zyObject*)pair.second;
//			if (pControl)
//				obj.push_back(pControl);
//		}
//	}
//	return (int)obj.size();
//}

BOOL BlackMoonUI::zyWidget::绑定窗口句柄(HWND 参数_窗口句柄) {
	return _BindWindow(参数_窗口句柄);
}
int BlackMoonUI::zyWidget::枚举控件(std::vector<zyObject*>& 参数_控件指针) {//获取所有控件指针(包含子控件)，返回总数
	参数_控件指针.clear();
	EnumChild(取窗口句柄(), 参数_控件指针);
	return (int)参数_控件指针.size();
}
void BlackMoonUI::zyWidget::EnumChild(HWND 参数_父窗口句柄, std::vector<zyObject*>& 参数_控件指针) {
	HWND next = GetWindow(参数_父窗口句柄, GW_CHILD);
	while(next) {
		zyObject* pWindow = zyEnv::getInstance().getWndObject(next);
		if (pWindow) {
			参数_控件指针.push_back(pWindow);
			EnumChild(next, 参数_控件指针);
		}
		next = GetWindow(next, GW_HWNDNEXT);
	}
}